Статистический анализ в Python

...

Приветствую вас на канале ТУЧ!
Сегодня мы немного коснемся теоретического материала из курса Теории Вероятностей и Статистики. Да, я понимаю, что это может и не пригодится вам, если вы хотите быть чистым разработчиком на python, однако мне, как будущему аналитику Яндекса, желательно повторить все способы рассмотрения основных метрик, завязанных на статистическом анализе.

Кстати

Данная статья будет полезна даже тем, кто не особо знаком со статистическим анализом, так как я лично попытаюсь объяснить своим преподавательским ртом каждую метрику, которую мы затронем :)

Статистика простыми словами
...

Статистика - это не просто сухие цифры и факты. На этом языке не могут общаться люди, но могут говорить данные. С помощью статистики можно делать прогнозы, побеждать в лотерее, выявлять вирусы, или же просто удобно собирать информацию.

Сегодня мы изучим две отдельные области статистики:

  • Описательную
  • Инферентную

Описательная статистика
...

Определение Описательной статистики

Описательная статистика помогает нам систематизировать данные, выделять основные характеристики и делать выводы на основе них. Это как путеводитель в мире цифровой информации.

Как я представляю Описательную статистику

Данная область науки занимается методами преобразования сырых данных в значимую информацию. Описательную статистику можно выполнять с помощью графиков, таблиц или статистических метрик. Однако наиболее популярным способом является использование статистических метрик, на которых мы, собственно, и сосредоточимся.

Когда я говорю о сырых данных, я имею ввиду данные, к которым я вообще никак не прикасался. Давайте рассмотрим пример, который можно взять, ну, допустим, из официального репозитория библиотеки seaborn.

import pandas as pd
import numpy as np
import seaborn as sns

tips = sns.load_dataset('tips')
tips.head()

запускаем всеми известные библиотеки, и скачиваем из интернета (а может они предустановлены? Не знаю) с помощью метода .load_dataset() таблицу tips. Выглядит она примерно так:

Таблица tips

Какие же метрики мы сегодня будем рассматривать?

  • Среднее (Mean)
  • Медиана (Median)
  • Мода (Mode)
  • Диапазон (Range)
  • Дисперсия (Variance)
  • Стандартное отклонение (Standard Deviation)

Чем отличается Среднее значение от Математического ожидания
...

Однажды я решил поспорить с гениями Слейновской Теократии, Великими Бóтанами нашего времени. Спор был очень простой - я должен был назвать самую тяжелую в мире ложь, в которую сами Ботаны бы поверили.
И я сказал:

Определение среднего значения и математического ожидания - Одно и то же

Спустя несколько секунд в меня полетели сначала книги, а потом уже слова о том, что я неправ.

Давайте решим простую задачку, чтобы разобраться, в чём же подвох.

Условие задачи
...

У вас есть 2 игральные кости. Найдите среднее арифметическое суммы чисел, а также найдите Мат. ожидание такой суммы.

Решение
...

Возьмем формулу среднего арифметического:
Теперь возьмем формулу для мат ожидания

Значения одинаковые! Тогда в чем же подвох? Почему бы среднее арифметическое не называть просто Мат. ожиданием и всё...

В чем же дело?

Чтобы увидеть различия этих двух понятий, посмотрите внимательно на формулы выше. Чувствуете разницу?

  • Если, допустим, изменить немного правила игры, и у одного из кубиков никогда не сможет выпасть число 2, то Среднее арифметическое, уверяю вас, будет так же равняться 7, а Мат ожидание по этой же формуле будет уже равняться 6.6:
    Просто среднее арифметическое не рассматривает те случаи, когда у чисел разные вероятностные доли, для нее всё одинаково

Ну что ж, поэтому в нашей реальности, когда мы говорим о среднем значении, мы больше подразумеваем математическое ожидание (там, где это возможно).

Среднее (Mean):
...

Среднее - это способ получить одиночное значение, представляющее наиболее часто встречающееся значение в данных. Среднее можно вычислить, сложив все существующие значения в данных и разделив их на количество значений. В Python же это можно сделать следующим образом:

round(tips['tip'].mean(), 3)  # 2.998

Медиана (Median):
...

Медиана - это значение, находящееся посередине данных, когда они упорядочены. Медиана предпочтительна, когда данные смещены (имеют выбросы), потому что она может представлять центр данных, минимизируя влияние выбросов. Медиану можно вычислить в Python следующим образом:

tips['tip'].median()  # 2.9

Мода (Mode):
...

Мода - это значение с наибольшей частотой в данных. Данные могут иметь одну моду (унимодальные), несколько мод (мультимодальные) или вовсе не иметь моды (если нет повторяющихся значений). В Python это можно сделать так:

tips['day'].mode()  # 'Sat' - В субботу чаще всего приходят в кафе

Диапазон (Range):
...

Диапазон - это разница между наибольшим (максимальным) и наименьшим (минимальным) значениями данных. Это простейшая мера разброса, потому что использует только два аспекта данных. Это можно посчитать в Python следующим образом:

tips['tip'].max() - tips['tip'].min()  # 9.0

Дисперсия (Variance):
...

Дисперсия - это измерение разброса данных, которое показывает, насколько данные распределены относительно среднего значения. Для вычисления дисперсии мы возводим в квадрат разницы каждого значения от среднего и делим это на количество значений данных. Поскольку обычно мы работаем с выборками данных, а не с полными популяциями, мы вычитаем единицу из количества значений данных (Не знаю даже почему, но теоретическое обоснование существует и оно долгое). Уравнение для вычисления дисперсии представлено на изображении ниже.

Давайте попробуем вычислить дисперсию данных с использованием Python:

round(tips['tip'].var(), 3)  # 1.914

Вычисленная дисперсия может предполагать высокий разброс в наших данных, но для более точной оценки разброса данных часто используется стандартное отклонение.

3. Стандартное отклонение (Standard Deviation)
...

Стандартное отклонение - наиболее распространенный способ измерения разброса данных, и оно вычисляется как квадратный корень из дисперсии.

Разница между дисперсией и стандартным отклонением заключается в информации, которую они предоставляют. Значение дисперсии указывает только на то, насколько разбросаны наши значения относительно среднего, и единицы измерения дисперсии отличаются от исходных значений, поскольку мы возвели исходные значения в квадрат. Однако значение стандартного отклонения имеет те же единицы измерения, что и исходные данные, что позволяет использовать его напрямую для измерения разброса данных.

Давайте попробуем вычислить стандартное отклонение с помощью следующего кода:

round(tips['tip'].std(), 3)  # 1.384

Одним из наиболее распространенных применений стандартного отклонения является оценка интервала данных. Мы можем оценить интервал данных, используя правило эмпирического распределения или правило 68–95–99,7. Правило эмпирического распределения утверждает, что 68% данных оцениваются в пределах среднего значения ± одно стандартное отклонение (STD), 95% данных в пределах среднего значения ± два STD и 99,7% данных в пределах среднего значения ± три STD. За пределами этого интервала можно считать значения выбросами.

То есть, если рассуждать логически, давайте посмотрим, есть ли такие данные среди выборки, которые не попадают в диапазон {Mean+-3STD}. Интересно...
Давайте это выясним!!!

Edge_left=round(tips['tip'].mean()-3*tips['tip'].std(),3)
Edge_right=round(tips['tip'].mean()+3*tips['tip'].std(),3)
print(f"По правилу 3х Отклонений, те чаевые, которые находятся вне диапазона [{Edge_left} - {Edge_right}] - Это выбросы")

tips[(tips['tip']>Edge_right) | (tips['tip']<Edge_left)]


Смотрите только, действительно, есть такие случаи. При среднем значении в 2.998, Эти отличаются более чем в 3 раза, и их наверное даже не стоит учитывать. ВАУ!

Инферентная статистика
...

Определение

Инферентная статистика - это раздел, который обобщает информацию о популяции на основе данных выборки. Инферентная статистика используется потому, что часто невозможно получить данные по всей популяции, и нам приходится делать выводы на основе выборки данных. Например, представим, что нам нужно понять мнение людей в Индонезии о искусственном интеллекте (ИИ). Однако исследование займет слишком много времени, если опрашивать каждого человека в популяции Индонезии. Поэтому мы используем выборочные данные, представляющие популяцию, и делаем выводы о мнении населения Индонезии о ИИ.

picgif
Коротко об Инферентной статистике (нет)

Давайте рассмотрим различные методы инферентной статистики, которые можно использовать.

Какие метрики рассмотрим:

  • Стандартная ошибка (Standard Error)
  • Доверительный интервал (Confidence Interval)
  • Проверка Гипотез (Hypothesis Testing)

Стандартная ошибка (Standard Error)
...

Стандартная ошибка - это измерение инферентной статистики, которое позволяет оценить истинный параметр популяции на основе статистики выборки. Информация о стандартной ошибке говорит о том, как будет варьироваться статистика выборки, если мы повторим эксперимент с данными из той же популяции.

Стандартная ошибка среднего (SEM) - это наиболее часто используемый тип стандартной ошибки, так как она показывает, насколько хорошо среднее значение будет представлять популяцию на основе выборочных данных. Для расчета SEM используется следующее уравнение:

from scipy.stats import sem

round(sem(tips['tip']), 3)  # 0.089

Обычно мы сообщаем SEM вместе с средним значением данных, где истинное среднее популяции оценивается в пределах среднего значения ± SEM.

data_mean = round(tips['tip'].mean(), 3)
data_sem = round(sem(tips['tip']), 3)
print(f'Реальное среднее значение популяции оценивается в пределах от {data_mean + data_sem} до  {data_mean - data_sem}')

Реальное среднее значение популяции оценивается в пределах от 3.087 до 2.909.

Доверительный интервал (Confidence Interval)
...

Доверительный интервал также используется для оценки истинного параметра популяции, но он вводит уровень доверия. Уровень доверия оценивает диапазон истинных параметров популяции с определенным процентом уверенности.

В статистике доверие можно описать как вероятность. Например, доверительный интервал с уровнем доверия 90% означает, что истинная оценка среднего популяции будет в пределах верхних и нижних значений доверительного интервала 90 раз из 100. Почти всегда доверительный интервал берется равным 95%. Доверительный интервал рассчитывается с использованием следующей формулы:

import scipy.stats as st

st.norm.interval(confidence=0.95, loc=data_mean, scale=data_sem)

(2.8235632053759354, 3.172436794624065)

Результат означает, что истинное среднее значение данных популяции находится в диапазоне от 2.82 до 3.17 с уровнем доверия 95%.

Проверка Гипотез (Hypothesis Testing)
...

Проверка гипотез - это метод инферентной статистики, который позволяет делать выводы о популяции на основе данных выборки. Оцениваемой популяцией могут быть как параметры популяции, так и вероятности.

При проведении проверки гипотез нам необходимо иметь предположение, называемое нулевой гипотезой (H0), и альтернативную гипотезу (Ha). Нулевая гипотеза и альтернативная гипотеза всегда противоположны друг другу. Процедура проверки гипотез использует данные выборки для определения того, можно ли отвергнуть нулевую гипотезу или нет (что означает принятие альтернативной гипотезы).

При проведении метода проверки гипотез необходимо определить уровень значимости. Уровень значимости представляет собой максимальную вероятность совершения ошибки первого рода (отклонение H0, когда H0 истинна), которая допускается в тесте. Обычно уровень значимости составляет 0.05 или 0.01.

Для получения вывода из выборки при проверке гипотез используется P-значение. При этом предполагается, что нулевая гипотеза истинна, чтобы измерить, насколько вероятны результаты выборки. Если P-значение меньше уровня значимости, мы отвергаем нулевую гипотезу; в противном случае мы не можем ее отвергнуть.

Примером проверки гипотез является двухвыборочный t-тест для определения различий между средними значениями двух групп. Результат теста:

st.ttest_ind(tips[tips['sex'] == 'Male']['tip'], tips[tips['sex'] == 'Female']['tip'])

Ttest_indResult(statistic=1.387859705421269, pvalue=0.16645623503456755)

Результат теста t-теста показывает, что чаевые между мужчинами и женщинами не значительно различаются, поскольку P-значение выше 0.05 уровня значимости. Это означает, что мы не можем отвергнуть нулевую гипотезу и приходим к выводу, что различий в средних значениях между двумя группами нет.

Конечно же, вышеописанный тест представляет собой упрощенный пример проверки гипотез. Существует множество предположений, которые необходимо учитывать при выполнении проверки гипотез, и множество тестов, которые можно использовать для удовлетворения наших потребностей. Но остальные важные параметры мы разберем позже, уже на самой работе, и то, если это будет действительно необходимо.


Заключение
...

Существуют два основных направления в области статистики, которые нам следует знать: описательная статистика и инферентная статистика. Описательная статистика связана с суммированием данных, в то время как инферентная статистика занимается обобщением данных для выводов о популяции. В данной статье мы рассмотрели описательную и инферентную статистику, приведя примеры с использованием языка программирования Python.

p.s. Если что, некоторая информация была написана с помощью Chat GPT, потому что самому становится не всегда очень приятно от того что пишу статью по мат статистике.